package com.cloud.easy.im.event;

import com.cloud.easy.im.argeement.Agreement;
import io.netty.channel.Channel;

import java.util.List;

/**
 * 服务监听处理器
 *
 * @author wangjian
 * @version 0.1.0
 * @create 2020年09月15日3:48 下午
 */
public interface ServerEventListener {

    /**
     * 用户身份验证回调方法定义.
     * 服务端的应用层可在本方法中实现用户登陆验证。
     * note：本回调在一种特殊情况下——即用户实际未退出登陆但再次发起来登陆包时，本回调是不会被调用的！
     * <p>
     * 本方法中用户验证通过（即方法返回值=0时）后 ，将立即调用回调方法
     * {@link ServerEventListener#onUserLoginAction_CallBack(String, String, Channel)}
     * 否则会将验证结果（本方法返回值错误码通过客户端的
     * ChatBaseEvent.onLoginMessage(int dwUserId, int dwErrorCode) 方法进行回调）通知客户端）。
     *
     * @param userId
     * @param token
     * @param extra
     * @param session
     * @return 结果码，"-1"为失败，"0"为成功
     */
    byte onVerifyUser_CallBack(String userId, String token, String extra, Channel session);

    /**
     * 用户登录验证成功后的回调方法定义（可理解为上线通知回调）.
     * 服务端的应用层通常可在本方法中实现用户上线通知等。
     * note：本回调在一种特殊情况下——即用户实际未退出登陆但再次发起来登陆包时，回调也是一定会被调用。
     *
     * @param userId
     * @param extra
     * @param session
     */
    void onUserLoginAction_CallBack(String userId, String extra, Channel session);

    /**
     * 用户退出登录回调方法定义（可理解为下线通知回调）。
     * 服务端的应用层通常可在本方法中实现用户下线通知等。
     *
     * @param userId
     * @param obj
     * @param session
     */
    void onUserLogoutAction_CallBack(String userId, Object obj, Channel session);

    /**
     * 消息发送之前，前置操作
     * <p>
     * 本方法的典型用途：消息落地，适用于所有消息场景，在消息发送逻辑正式执行前执行
     *
     * @param dataFromClient
     * @return
     */
    void messageBefore_CallBack(Agreement dataFromClient);

    /**
     * 收到客户端发送给“其它客户端”的数据回调通知（即：消息路径为“C2C”的消息）.
     * note：本方法当且仅当在数据被服务端成功实时发送（“实时”即意味着对方在线的情况下）出去后被回调调用.
     * <p>
     * 本方法的典型用途：开发者可在本方法中可以实现用户聊天信息的收集，以便后期监控分析用户的行为等。
     *
     * @param dataFromClient
     * @return
     */
    void messageSendSuccess_C2C_CallBack(Agreement dataFromClient);

    /**
     * 服务端在进行消息直发（S2C消息）或转发（C2C消息）时，当对方在线但实时发送失败、以及其它各种问题导 致消息并没能正常发出时，
     * 将无条件走本回调通知。
     * note：本方法当且仅当在数据被服务端在线发送失败后被回调调用.
     *
     * @param dataFromClient
     */
    boolean messageSendFaild_C2C_CallBack(Agreement dataFromClient);

    /**
     * 用户发送群组信息时，通过此回调接口返回群组中除自己以外，所有在线用户的id列表
     * note：注意此接口最好只返回在线列表（最佳实践：可以通过位图结构，实时更新在线群组人员）
     * @param groupId   群组id
     * @param userId    发送人id
     * @return
     */
    List<String> messageGroupAction_CallBack(String groupId, String userId);
}
